/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Model;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

/**
 *
 * @author Marcel
 */
public final class Evento {

    private String nome;
    private List<Artista> artistas;
    private int id;
    private List<Ingresso> ingressos;
    private float precoIngresso;
    private int qtdTotalIngressos;  //Todos os ingressos, inclusive os que foram vendidos
    private int qtdIngressos;
    private int qtdIngressosNormal;
    private int qtdIngressosVIP;
    private int qtdIngressosCamarote;
    private Calendar inicio;
    private Calendar fim;
    private String tipoEvento;
    private Produtor produtor;
    private float valorDoAluguel;
    private float porcentagemVendaIngressos;
    private String tipoAcomodacao;
    private boolean cancelado;
    private float lucroEvento;

    public float getPrecoIngresso() {
        return precoIngresso;
    }

    public float getPorcentagemVendaIngressos() {
        return porcentagemVendaIngressos;
    }

    public float getValorDoAluguel() {
        return valorDoAluguel;
    }

    public String getTipoAcomodacao() {
        return tipoAcomodacao;
    }

    public void setCancelado(boolean cancelado) {
        this.cancelado = cancelado;
    }

    public Evento() {
    }

    public Evento(int id, String nome, List<Artista> artistas, float precoIngresso, int qtdTotalIngressos,
            Calendar inicio, Calendar fim,
            String tipoEvento, String nomeProdutor, String nomeProdutora,
            float valorDoAluguel, float porCentagemVendaIngressos, String tipoAcomodacao) {

        Produtor produtor = new Produtor(nomeProdutor, nomeProdutora);

        this.ingressos = new ArrayList<Ingresso>();
        this.qtdIngressos = 120;
        this.qtdIngressosNormal = (int) (qtdIngressos * 0.5f);
        this.qtdIngressosVIP = (int) (qtdIngressos * 0.25f);
        this.qtdIngressosCamarote = (int) (qtdIngressos * 0.25f);
        this.nome = nome;
        this.artistas = artistas;
        this.precoIngresso = precoIngresso;
        this.qtdTotalIngressos = qtdTotalIngressos;
        this.inicio = inicio;
        this.fim = fim;
        this.tipoEvento = tipoEvento;
        this.produtor = produtor;
        this.valorDoAluguel = valorDoAluguel;
        this.porcentagemVendaIngressos = porCentagemVendaIngressos;
        this.tipoAcomodacao = tipoAcomodacao;
        this.id = id;
        this.cancelado = false;
        criaIngressos();
    }

    public int getQtdIngressosCamarote() {
        return qtdIngressosCamarote;
    }

    public int getQtdIngressosNormal() {
        return qtdIngressosNormal;
    }

    public int getQtdIngressosVIP() {
        return qtdIngressosVIP;
    }

    public int getQtdIngressosVIPNaoVendidos() {
        int total = 0;
        for (int i = 0; i < qtdIngressosVIP; i++) {
            if (!ingressos.get(i).isVendido()) {
                total++;
            }
        }
        return total;
    }

    public Calendar getFim() {
        return fim;
    }

    public List<Artista> getArtistas() {
        return artistas;
    }

    public String getNome() {
        return nome;
    }

    public Produtor getProdutor() {
        return produtor;
    }

    public String getTipoEvento() {
        return tipoEvento;
    }

    public Calendar getInicio() {
        return inicio;
    }

    int getId() {
        return id;
    }

    public List<Ingresso> getIngressos() {
        return ingressos;
    }

    void vendeIngresso(int numLugar) {
        ingressos.get(numLugar).vendeIngresso();
        qtdIngressos--;
    }

    void adicionaIngresso(int numLugar, char fileira) {
        Ingresso ingresso = new Ingresso(numLugar, fileira);
    }

    private void criaIngressos() {
        if (("Sentado").equalsIgnoreCase(tipoAcomodacao)) {
            for (int i = 0; i < qtdTotalIngressos / 10; i++) {
                Ingresso ingresso = new Ingresso(i, 'A');
                ingressos.add(ingresso);
            }
            for (int i = 0; i < qtdTotalIngressos / 10; i++) {
                Ingresso ingresso = new Ingresso(i, 'B');
                ingressos.add(ingresso);
            }
            for (int i = 0; i < qtdTotalIngressos / 10; i++) {
                Ingresso ingresso = new Ingresso(i, 'C');
                ingressos.add(ingresso);
            }
            for (int i = 0; i < qtdTotalIngressos / 10; i++) {
                Ingresso ingresso = new Ingresso(i, 'D');
                ingressos.add(ingresso);
            }
            for (int i = 0; i < qtdTotalIngressos / 10; i++) {
                Ingresso ingresso = new Ingresso(i, 'E');
                ingressos.add(ingresso);
            }
            for (int i = 0; i < qtdTotalIngressos / 10; i++) {
                Ingresso ingresso = new Ingresso(i, 'F');
                ingressos.add(ingresso);
            }
            for (int i = 0; i < qtdTotalIngressos / 10; i++) {
                Ingresso ingresso = new Ingresso(i, 'G');
                ingressos.add(ingresso);
            }
            for (int i = 0; i < qtdTotalIngressos / 10; i++) {
                Ingresso ingresso = new Ingresso(i, 'H');
                ingressos.add(ingresso);
            }
            for (int i = 0; i < qtdTotalIngressos / 10; i++) {
                Ingresso ingresso = new Ingresso(i, 'I');
                ingressos.add(ingresso);
            }
            for (int i = 0; i < qtdTotalIngressos / 10; i++) {
                Ingresso ingresso = new Ingresso(i, 'J');
                ingressos.add(ingresso);
            }
        } else {
            for (int i = 0; i < qtdTotalIngressos; i++) {
                Ingresso ingresso = new Ingresso();
                ingressos.add(ingresso);
            }
            for (int i = 0; i < qtdIngressosVIP; i++) {
                ingressos.get(i).setSetor("VIP");
            }
            for (int i = qtdIngressosVIP; i < qtdIngressosVIP + qtdIngressosNormal; i++) {
                ingressos.get(i).setSetor("Normal");
            }
            for (int i = qtdIngressosVIP + qtdIngressosNormal; i < qtdIngressosVIP + qtdIngressosNormal + qtdIngressosCamarote; i++) {
                ingressos.get(i).setSetor("Camarote");
            }
        }
    }

    void cancelaEvento() {
        cancelado = true;
    }

    public void setArtistas(List<Artista> artistas) {
        this.artistas = artistas;
    }

    public void setInicio(Calendar data) {
        this.inicio = data;
    }

    public void setFim(Calendar data) {
        this.fim = data;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public void setPorCentagemVendaIngressos(float porCentagemVendaIngressos) {
        this.porcentagemVendaIngressos = porCentagemVendaIngressos;
    }

    public void setPrecoIngresso(float precoIngresso) {
        this.precoIngresso = precoIngresso;
    }

    public void setProdutor(Produtor produtor) {
        this.produtor = produtor;
    }

    public void setQtdIngressos(int qtdIngressos) {
        this.qtdIngressos = qtdIngressos;
    }

    public void setQtdTotalIngressos(int qtdTotalIngressos) {
        this.qtdTotalIngressos = qtdTotalIngressos;
    }

    public void setTipoAcomodacao(String tipoAcomodacao) {
        this.tipoAcomodacao = tipoAcomodacao;
    }

    public void setTipoEvento(String tipoEvento) {
        this.tipoEvento = tipoEvento;
    }

    public void setValorDoAluguel(float valorDoAluguel) {
        this.valorDoAluguel = valorDoAluguel;
    }

    public String getNomesArtistas() {
        String string = "";
        for (Artista a : artistas) {
            string = string + a.getNome() + "(" + a.getGenero() + "),";
        }
        return string;
    }

    public String getNomeProdutor() {
        return "" + produtor.getNome() + "(" + produtor.getProdutora() + ")";
    }

    public int getQtdIngressos() {
        return qtdIngressos;
    }

    public int setQtdIngressosCamarote(int i) {
        return qtdIngressosCamarote;
    }

    public int setQtdIngressosNormal(int i) {
        return qtdIngressosNormal;
    }

    public int setQtdIngressosVIP(int i) {
        return qtdIngressosVIP;
    }

    public String getTituloShow() {
        return "Detalhes do Evento " + nome + " (" + tipoEvento + ")";
    }

    public String getTextoIngressos() {
        return qtdIngressos + "(" + qtdIngressosVIP + " VIPS + " + qtdIngressosNormal + " Normais + " + qtdIngressosCamarote + " Camarote)";
    }

    public String getInfoProdutor() {
        return produtor.getNome() + " - " + produtor.getProdutora();
    }

    public String getInicioString() {
        int dia = inicio.getTime().getDate();
        int mes = inicio.getTime().getMonth() + 1;
        int ano = inicio.getTime().getYear() + 1900;
        int hora = inicio.getTime().getHours();
        int minuto = inicio.getTime().getMinutes();
        return dia + "/" + mes + "/" + ano + " - " + hora + ":" + minuto;
    }

    public String getFimString() {
        int dia = fim.getTime().getDate();
        int mes = fim.getTime().getMonth() + 1;
        int ano = fim.getTime().getYear() + 1900;
        int hora = fim.getTime().getHours();
        int minuto = fim.getTime().getMinutes();
        return dia + "/" + mes + "/" + ano + " - " + hora + ":" + minuto;
    }

    public boolean getCancelado() {
        return cancelado;
    }

    public int getQtdIngressosNormalNaoVendidos() {
        int total = 0;
        for (int i = qtdIngressosVIP; i < qtdIngressosVIP + qtdIngressosNormal; i++) {
            if (!ingressos.get(i).isVendido()) {
                total++;
            }
        }
        return total;
    }

    public int getQtdIngressosCamaroteNaoVendidos() {
        int total = 0;
        for (int i = qtdIngressosVIP + qtdIngressosNormal; i < qtdIngressosVIP + qtdIngressosNormal + qtdIngressosCamarote; i++) {
            if (!ingressos.get(i).isVendido()) {
                total++;
            }
        }
        return total;
    }

    public int getQtdIngressosNaoVendidos() {
        int total = 0;
        for (int i = 0; i < ingressos.size(); i++) {
            if (!ingressos.get(i).isVendido()) {
                total++;
            }
        }
        return total;
    }

    public int getQtdIngressosVendidos() {
        int total = 0;
        for (int i = 0; i < ingressos.size(); i++) {
            if (ingressos.get(i).isVendido()) {
                total++;
            }
        }
        return total;
    }

    public float calculaLucro() {
        float arrecadacao = valorDoAluguel;
        for (Ingresso i : ingressos) {
            if (i.isVendido()) {
                arrecadacao += precoIngresso * porcentagemVendaIngressos / 100.f;
            }
        }
        return arrecadacao;
    }
}
